/*
 * ColaMensajesSDLSDL.cpp
 *
 *  Created on: Nov 12, 2011
 *      Author: gonzalo
 */

#include "ColaMensajesSDL.h"
#include "../common/utils/Logger.h"

ColaMensajesSDL::ColaMensajesSDL(ConditionVariable* notifyTo){
	this->accesible = true;
	this->notifyTo = notifyTo;
}

ColaMensajesSDL::ColaMensajesSDL()  {
	this->accesible = true;
	this->notifyTo = NULL;
}

ColaMensajesSDL::~ColaMensajesSDL() {

	while(!events.empty()){
		delete events.back();
		events.pop_back();
	}

}

void ColaMensajesSDL::terminar(){
	this->accesible = false;
}

void ColaMensajesSDL::setEvent(Event* event){
	if (event ==NULL) {
		return;
	}

//	Logger::log("ColaMensajesSDL", "setMensaje","Recibio un nuevo SDL_EVENT en lista" );
	events.push_back(event);

	signal();

	if (notifyTo) {
		notifyTo->signal();
	}
}

Event* ColaMensajesSDL::getEvent(){
//	Logger::log("ColaMensajesSDL", "getMensaje","Pide mensaje (SDL_EVENT) a la lista");

	if (!this->accesible) {
		return NULL;
	}

	//Si la Lista esta vacia me quedo bloqueado hasta que llegue una senial
	if (events.empty()) {
		wait();
	}

	//Si despues del wait esta vacio es que esta terminando el proceso
	if (events.empty()) {
		return NULL;
	}

	Event* retorno = events.front();
	events.pop_front();

	return retorno;
}

bool ColaMensajesSDL::hasEvents(){
	return !events.empty();
}
